home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / c / sozobon / sozuti09.zoo / sozdistr / doc / binary.doc / german / hints.txt < prev    next >
Encoding:
Text File  |  1994-07-19  |  1.9 KB  |  72 lines

  1. Hinweise zum Programmieren mit SOZOBON C für ATARI-TOS Programme.
  2.  
  3. 1. Accessories programmieren.
  4.  
  5. Da nicht alle TOS versionen den environment Zeiger in der Basepage setzten,
  6. empfehle ich im main Module eine der folgenden Funktionen einzufügen:
  7.  
  8. Wenn environment Variablen nicht benötigt werden:
  9.  
  10. char *getenv(char *var)
  11. {
  12.     return(NULL);
  13. }
  14.  
  15.  
  16. ansonsten:
  17.  
  18. char *getenv( char *var)
  19. {
  20.     char *string;
  21.  
  22.     if (gl_apversion == 0)    /* don't call before appl_init()    */
  23.         return(NULL);
  24.     shel_envrn(&string, var)
  25.     if (string) {
  26.         if (*string == '=')    /* is this if/else okay ??    */
  27.             return(++string);
  28.         else
  29.             return("");
  30.     } else
  31.         return NULL;
  32.         
  33. }    /* acc getenv() routine    */
  34.  
  35.  
  36. Ein weiters Problem bei Accessories ist der dynamische Speicher Zugriff.
  37. Sie können normalerweise Speicher nicht über einen AC_CLOSE event hinweg
  38. behalten. Und andererseits ist nicht so leicht festzustellen ob der Speicher
  39. freigegeben werden muß, oder es schon ist.
  40.  
  41. Dazu gibt es die Funktion 
  42.  
  43. extern BASEPAGE *Getbpact_pd();
  44.  
  45. Sie ist nach dem ersten malloc() bzw. Malloc() aufzurufen, wobei der Wert
  46. gespeichert werden sollte. (etwa in BASEPAGE *m_act_bp)
  47.  
  48.    BASEPAGE *m_act_pd;    /* global variable */
  49.  
  50.    /* malloc() erfolgreich, und nun: */
  51.    if(!m_act_pd)
  52.        m_act_pd = Getbpact_pd();
  53.  
  54. Nach einem AC_CLOSE sollte dann die Funktion aufgerufen werden die den
  55. Speicher freigibt. Mit folgendem code Beispiel kann getestet werden,
  56. ob der Speicher noch freigegeben werden muß:
  57.  
  58.    BASEPAGE *c_act_pd;
  59.    
  60.    if ((gl_apid >= 0x300) || (m_act_pd == (c_act_pd = Getbpact_pd()) )||
  61.         (m_act_pd == c_act_pd->p_parent) ){
  62.        /* Speicher freigeben */
  63.    }
  64.    /* alle Referencen auf den Speicher löschen */
  65.  
  66.    m_act_pd = NULL;
  67.    /* wieder auf Null setzten, damit beim nächsten malloc()/Malloc() der
  68.    aktuelle Wert eingetragen werden kann. */
  69.  
  70. Analog kann mensch natürlich so auch rauskriegen, ob der Speicher behalten
  71. werden kann. Doch diese Abfrage ist etwas komplizierter.
  72.